package com.datatraffic.services;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.datatraffic.databasecontrol.DatabaseControl;
import com.datatraffic.salesup.model.Form;

import android.content.Context;
import android.util.Log;

public class FormsManager{
	
	private Context contexto;
	
	public FormsManager(Context contexto)
	{
		this.contexto = contexto;
	}
	
	private Boolean checkNetwork() {		
		boolean result = false;
		if(this.contexto != null)
		{
			URL url;
			try {
				url = new URL("http://www.datatraffic.com.co/salesup/servicio/TestServer.php");
				HttpURLConnection urlc = (HttpURLConnection) url
						.openConnection();
				urlc.setConnectTimeout(5000);
				urlc.connect();
				if (urlc.getResponseCode() == 200)
				{
					result = true;
				}
			} catch (IOException e) {
				
			}
		}
		return result;
	}	
	
	public JSONObject crearFormulario(JSONObject recibido)
	{
		JSONObject resultado = jsonError();		
		
		if(recibido != null)
		{
			if(checkNetwork())
			{
				Log.i ("CONEXION: ", "OK");
				AccionesOnline online = new AccionesOnline();
				resultado = online.crearFormulario(recibido);
			}
			else
			{
				Log.i ("CONEXION: ", "NO HAY");
			}
			
			try
			{
				recibido.put("sent", 0);
				recibido.put("server_id", -1);
				
				if (resultado != null)
				{
					if(resultado.optString("error").equalsIgnoreCase("false"))
					{
						int server_id = (int) resultado.optJSONArray("data").optJSONObject(0).optLong("id");
						
						if(server_id > 0)
						{
							recibido.put("server_id", server_id);
							recibido.put("sent", 1);
						}
					}
				}
				
				AccionesOffline offline = new AccionesOffline(this.contexto);
				resultado = offline.crearFormulario(recibido);
			}
			catch(Exception e)
			{
				e.printStackTrace();				
			}
		}
		
		return resultado;	
	}
	
	public JSONObject editarFormulario(JSONObject recibido)
	{
		JSONObject resultado = jsonError();
		
		if(checkNetwork())
		{
			Log.i ("CONEXION: ", "OK");
			
			try
			{			
				if(recibido.getInt("server_id") > 0)
				{
					Log.i ("INSERTADO SERVIDOR: ", "OK");
					AccionesOnline online = new AccionesOnline();
					resultado = online.editarFormulario(recibido);
				}
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}				
		}

		try
		{
			int local_id = 0;
			
			try
			{
				local_id = recibido.getInt("local_id");
				recibido.put("last_version_id", local_id);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			
			recibido.put("sent", 0);
			recibido.put("server_id", -1);
			
			if (resultado != null)
			{
				if(resultado.optString("error").equalsIgnoreCase("false"))
				{
					int server_id = (int) resultado.optJSONArray("data").optJSONObject(0).optLong("id");
					
					if(server_id > 0)
					{
						recibido.put("server_id", server_id);
						recibido.put("sent", 1);
						
						deleteFormById(local_id);
					}
				}
			}	
			
			AccionesOffline offline = new AccionesOffline(this.contexto);
			resultado = offline.editarFormulario(recibido);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}			
		
		return resultado;			
	}	
	
	public JSONObject consultarFormulario(JSONObject recibido)
	{
		JSONObject resultado = jsonError();
		String filtro = recibido.optString("filtro");
		Log.i ("CONEXION: ", "NO HAY");
		AccionesOffline offline = new AccionesOffline(this.contexto);
		resultado = offline.consultarFormulario(recibido,filtro);
		
		JSONArray data = resultado.optJSONArray("data");
		
		if(data.length() <= 0)
		{
			AccionesOnline online = new AccionesOnline();
			resultado = online.consultarFormulario(recibido);			
		}
		
		return resultado;			
	}
	
	public JSONObject cargarlista(JSONObject recibido)
	{
		JSONObject resultado = jsonError();	
		
		Log.i ("CONEXION: ", "NO HAY");
		String filtro = recibido.optString("filtro");
		AccionesOffline offline = new AccionesOffline(this.contexto);
		resultado = offline.consultarFormulario(recibido,filtro);
		
		JSONArray data = resultado.optJSONArray("data");	
		
		
		
		return resultado;			
	}
	
	
	
	public void traerDesdeServidor(int user)
	{
		try
		{
			AccionesOffline offline = new AccionesOffline(this.contexto);
						
			JSONObject request = new JSONObject();
			request.put("function", "selectForm");
			request.put("mobile_key", "");
			request.put("resource", "");
			request.put("user", user);
			request.put("query", "");
			request.put("start", 0);
			request.put("limit", 200);
			request.put("order", "");
			request.put("mode", "");
			
			Log.i("TODOS",request.toString());
			
			AccionesOnline online = new AccionesOnline();
			JSONObject resultado = online.consultarFormulario(request);
			
			JSONArray data = resultado.optJSONArray("data");
			
			for (int i = 0; i < data.length(); i++) {
				JSONObject item = data.getJSONObject(i);
				item.put("sent", 1);
				
				item.put("date_time", "");
				item.put("latitude", "0");
				item.put("longitude", "0");
				item.put("speed", "0");
				item.put("heading", "0");
				item.put("precision", "0");			
				
				offline.crearFormulario(item);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public JSONObject consultarLista(JSONObject recibido)
	{
		JSONObject resultado = jsonError();
		
		try
		{
			recibido.put("function", "selectForm");
			recibido.put("query", "");
			String filtro = recibido.optString("filtro");
			Log.i ("CONEXION: ", "NO HAY");
			AccionesOffline offline = new AccionesOffline(this.contexto);
			resultado = offline.consultarFormulario(recibido,filtro);
			
			JSONArray data = resultado.optJSONArray("data");
			
			if(data.length() <= 0)
			{
				if(checkNetwork())
				{
					int start = recibido.optInt("start");
					if(start == 0)
					{	
						int user = recibido.optInt("user");
						traerDesdeServidor(user);
						resultado = offline.consultarFormulario(recibido,"");
					}
				}			
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		return resultado;			
	}	
	
	public Form[] consultarArregloFormulario(JSONObject recibido)
	{
		int limit = 10;
		try
		{
			limit = (int) recibido.optLong("limit");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		Form[] respuestas = new Form[limit];
		
		Log.i ("CONEXION: ", "NO HAY");
		AccionesOffline offline = new AccionesOffline(this.contexto);
		JSONObject resultado = offline.consultarFormulario(recibido,"");
		JSONArray data = resultado.optJSONArray("data");
		
		if(data.length() < 0)
		{
			AccionesOnline online = new AccionesOnline();
			resultado = online.consultarFormulario(recibido);			
		}
		
		data = resultado.optJSONArray("data");
		
		for (int i = 0; i < data.length() && i < limit; i++) {
			JSONObject aux;
			Form temp = new Form();
			try {
				aux = data.getJSONObject(i);
				temp = new Form(aux);
			} catch (JSONException e) {
				e.printStackTrace();
			}			
			respuestas[i] = temp;
		}		
		
		return respuestas;			
	}
	
	public JSONObject login (JSONObject login) throws Exception
	{
		JSONObject resultado = jsonError();
		if(checkNetwork())
		{
			AccionesOnline online = new AccionesOnline();
			resultado = online.hacerLogin(login);
			
			Log.i("LOGIN ONLINE",resultado.toString());
			
			if(resultado.optString("error").equalsIgnoreCase("false"))
			{
				resultado.put("user", login.optString("user"));
				resultado.put("password", login.optString("password"));
				resultado.put("server_id", resultado.optJSONArray("data").getJSONObject(0).optInt("id"));
				
				AccionesOffline offline = new AccionesOffline(this.contexto);
				offline.guardarLogin(resultado);	
			}
		}
		else
		{
			
			AccionesOffline offline = new AccionesOffline(this.contexto);
			resultado = offline.hacerLogin(login);
			
			Log.i("LOGIN OFFLINE",resultado.toString());
		}
		return resultado;
	}
	
	public JSONObject estadisticasPorFechas (JSONObject login) throws Exception
	{
		if(checkNetwork())
		{
			AccionesOnline online = new AccionesOnline();
			return online.consultarEstadisticas(login);
		}
		else
		{
			JSONObject result = jsonError();			
			return result;
		}
		
	}
	
	public JSONObject numFormularios (JSONObject datos)
	{
		AccionesOffline offline = new AccionesOffline(this.contexto);
		int num = offline.getNumForms(datos);
		
		JSONObject result = jsonError();
		
		try {
			result.put("error","false");
			result.put("msg","OK");
			result.put("total",1);
			
			JSONArray array = new JSONArray();
			JSONObject obj = new JSONObject();
			obj.put("total", num);
			array.put(obj);
			
			result.put("data",array);
			
		} catch (JSONException e) {
			e.printStackTrace();
		}

		return result;
	}
	
	public void deleteFormById(int form_id)
	{
		AccionesOffline offline = new AccionesOffline(this.contexto);
		offline.deleteFormById(form_id);
	}
	
	public void sincronizar()
	{
		if(checkNetwork())
		{
			DatabaseControl dbc = new DatabaseControl(this.contexto);
			dbc.open();		
			JSONObject resultado = dbc.getUnsentForms();
			AccionesOnline online = new AccionesOnline();
			
			if(resultado.optString("error").equalsIgnoreCase("false"))
			{
				JSONArray data = resultado.optJSONArray("data");
				
				for (int i = 0; i < data.length(); i++) {
					JSONObject aux = data.optJSONObject(i);
					
					Log.i("ENCONTRADO: ",aux.toString());
					
					
					try
					{
						aux.put("mobile_key", "356612021160629");
						aux.put("resource", "356612021160629");
						
						int local_id = aux.getInt("local_id");
						int actual_server_id = aux.getInt("server_id");
						int parent_version_id = aux.getInt("last_version_id");
						
						if(parent_version_id <= 0)
						{
							aux.put("function", "registerForm");
							
							
							JSONObject response = online.crearFormulario(aux);
							Log.i("RESPONSE: ",response.toString());
							
							if (response != null)
							{
								if(response.optString("error").equalsIgnoreCase("false"))
								{
									actual_server_id = (int) response.optJSONArray("data").optJSONObject(0).optLong("id");
									
									if(actual_server_id > 0)
									{
										dbc.updateServerId(local_id,actual_server_id);
									}
								}
							}
						}
						else
						{
							aux.put("function", "updateForm");
							
							JSONObject parent = dbc.getFormById(parent_version_id);
							
							Log.i("PADRE: ",parent.toString());
							
							JSONArray array = parent.optJSONArray("data");
							
							if(array.length() > 0)
							{
								int parent_server_id = (int) array.optJSONObject(0).optLong("server_id");
								
								aux.put("server_id", parent_server_id);
								
								Log.i("DEFINITVIO: ",aux.toString());
													
								JSONObject response = online.crearFormulario(aux);
								
								Log.i("RESPONSE: ",response.toString());
								
								
								if (response != null && response.optString("error").equalsIgnoreCase("false"))
								{
									actual_server_id = (int) response.optJSONArray("data").optJSONObject(0).optLong("id");
									
									if(actual_server_id > 0)
									{
										dbc.updateServerId(local_id,actual_server_id);
										//dbc.deleteFormById(parent_version_id);
									}
								}
							}
							else
							{
								aux.put("function", "registerForm");
								
								
								JSONObject response = online.crearFormulario(aux);
								
								if (response != null)
								{
									if(response.optString("error").equalsIgnoreCase("false"))
									{
										actual_server_id = (int) response.optJSONArray("data").optJSONObject(0).optLong("id");
										
										if(actual_server_id > 0)
										{
											dbc.updateServerId(local_id,actual_server_id);
										}
									}
								}								
							}
						}
					}
					catch(Exception e)
					{
						e.printStackTrace();
					}
				}
			}
			
			dbc.close();
			
		}
	}
	
	public JSONObject consultarnombre(JSONObject recibido) {		
		
		JSONObject result = jsonError();
		
		AccionesOffline offline = new AccionesOffline(this.contexto);
		result= offline.consultarnombre(recibido);
		
		try {
			
			
			JSONArray array = new JSONArray();
			JSONObject obj = new JSONObject();
			obj.put("data", result);
			//array.put(obj);
			
			result.put("data",result.optJSONArray("data"));
			
			
		} catch (JSONException e) {
			e.printStackTrace();
		}

		return result;
	}
	
	private JSONObject jsonError()
	{
		JSONObject resultado = null;
		try {
			resultado = new JSONObject();
			resultado.put("error", "true");
			resultado.put("msg", "Ocurrio un error");
			resultado.put("total", 0);
			resultado.put("data",  new JSONArray());			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return resultado;
	}

	
	
	

}
